/**
 * 折半查找类
 * 43：findPage方法用于查找标题所在的分页
 * 67：findLine方法用于查找标题所在的位置
 * 103：find方法用于给出文章的所有信息
 */


import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class HalfSearch {

    /**
     * 内部类Index
     * 用于记录检索信息
     */
    public class Index{
        private int indexnum;  //索引数
        private String title;  //标题
        public Index(String indexnum,String title){
            this.indexnum=Integer.parseInt(indexnum);
            this.title=title;
        }
        //获得索引数
        public int getIndexnum(){
            return this.indexnum;
        }
        //获得标题
        public String getTitle(){
            return this.title;
        }
    }

    /**
     * 在二级索引中查找记录在一级索引中的位置（即所在分页的位置）
     */
    public int findPage(String path,String s){
        List<Index> lis=new ArrayList<Index>();
        try{
            File secindex = new File(path);
            BufferedReader br=new BufferedReader(new InputStreamReader(new FileInputStream(secindex),"utf-8"));
            String line="";
            while((line=br.readLine())!=null){
                String[] strarray=line.split(" ", 2);
                Index tempi=new Index(strarray[0],strarray[1]);
                lis.add(tempi);
            }
            br.close();
        }catch(IOException e){
            e.printStackTrace();
        }
        int i=0;
        while(s.compareTo(lis.get(i).getTitle())>=0) {
        	i++;
        }  //线性查找title所在的分页
        return lis.get(i-1).getIndexnum();  //返回页数
        
    }

    /**
     * 查找记录在有序记录集合中的位置
     */
    public int findLine(String s){
        int i=findPage("./data/index/secindex.txt",s);
        String path="./data/index/index_"+i+".txt";
        Index[] li=new Index[10000];
        int j=0;
        try{
            File page=new File(path);
            BufferedReader brl=new BufferedReader(new InputStreamReader(new FileInputStream(page),"utf-8"));
            String line="";
            while((line=brl.readLine())!=null){
                String[] strarray=line.split(",", 2);
                li[j]=new Index(strarray[0],strarray[1]);
                j++;
            }
            brl.close();
        }catch(IOException e){
            e.printStackTrace();
        }
        //折半查找
        int left=0,right=j-1; 
        while(left<right){
            int mid=(left+right)/2;
            if(s.compareTo(li[mid].getTitle())==0){
                return li[mid].getIndexnum();  //找到则返回原始记录位置
            }else if(s.compareTo(li[mid].getTitle())>0){
                left=mid+1;
            }else{
                right=mid-1;
            }
        }
        return -1;  //未找到则返回-1
    }

    /**
     * 在有序集合中查找记录并显示
     */
    public List<String> find(String s){
         int l=findLine(s);
         //完成记录存在的判断
         if(l==-1){
             return null;  //不存在则直接返回null到调用点
         }

         int p=(l-1)/10000;  //找到所在分页
         int r=l%10000;  //找到所在行
         String path="./data/paging/page_"+p+".txt";
         String line="";
         try{
             File txt=new File(path);
             BufferedReader brt=new BufferedReader(new InputStreamReader(new FileInputStream(txt),"utf-8"));
             for(int i=0;i<r;i++){
                line=brt.readLine();
             }
             brt.close();
         }catch(IOException e){
             e.printStackTrace();
         }
         String[] str=line.split("\\|");
         return Arrays.asList(str);  //存在则返回一个字符数组到调用点
    }
}